home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / idlelib / TreeWidget.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2005-10-18  |  16.1 KB  |  555 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. import os
  5. import sys
  6. from Tkinter import *
  7. import imp
  8. import ZoomHeight
  9. from configHandler import idleConf
  10. ICONDIR = 'Icons'
  11.  
  12. try:
  13.     _icondir = os.path.join(os.path.dirname(__file__), ICONDIR)
  14. except NameError:
  15.     _icondir = ICONDIR
  16.  
  17. if os.path.isdir(_icondir):
  18.     ICONDIR = _icondir
  19. elif not os.path.isdir(ICONDIR):
  20.     raise RuntimeError, "can't find icon directory (%r)" % (ICONDIR,)
  21.  
  22.  
  23. def listicons(icondir = ICONDIR):
  24.     '''Utility to display the available icons.'''
  25.     root = Tk()
  26.     import glob
  27.     list = glob.glob(os.path.join(icondir, '*.gif'))
  28.     list.sort()
  29.     images = []
  30.     row = column = 0
  31.     for file in list:
  32.         name = os.path.splitext(os.path.basename(file))[0]
  33.         image = PhotoImage(file = file, master = root)
  34.         images.append(image)
  35.         label = Label(root, image = image, bd = 1, relief = 'raised')
  36.         label.grid(row = row, column = column)
  37.         label = Label(root, text = name)
  38.         label.grid(row = row + 1, column = column)
  39.         column = column + 1
  40.         if column >= 10:
  41.             row = row + 2
  42.             column = 0
  43.             continue
  44.     
  45.     root.images = images
  46.  
  47.  
  48. class TreeNode:
  49.     
  50.     def __init__(self, canvas, parent, item):
  51.         self.canvas = canvas
  52.         self.parent = parent
  53.         self.item = item
  54.         self.state = 'collapsed'
  55.         self.selected = False
  56.         self.children = []
  57.         self.x = None
  58.         self.y = None
  59.         self.iconimages = { }
  60.  
  61.     
  62.     def destroy(self):
  63.         for c in self.children[:]:
  64.             self.children.remove(c)
  65.             c.destroy()
  66.         
  67.         self.parent = None
  68.  
  69.     
  70.     def geticonimage(self, name):
  71.         
  72.         try:
  73.             return self.iconimages[name]
  74.         except KeyError:
  75.             pass
  76.  
  77.         (file, ext) = os.path.splitext(name)
  78.         if not ext:
  79.             pass
  80.         ext = '.gif'
  81.         fullname = os.path.join(ICONDIR, file + ext)
  82.         image = PhotoImage(master = self.canvas, file = fullname)
  83.         self.iconimages[name] = image
  84.         return image
  85.  
  86.     
  87.     def select(self, event = None):
  88.         if self.selected:
  89.             return None
  90.         
  91.         self.deselectall()
  92.         self.selected = True
  93.         self.canvas.delete(self.image_id)
  94.         self.drawicon()
  95.         self.drawtext()
  96.  
  97.     
  98.     def deselect(self, event = None):
  99.         if not self.selected:
  100.             return None
  101.         
  102.         self.selected = False
  103.         self.canvas.delete(self.image_id)
  104.         self.drawicon()
  105.         self.drawtext()
  106.  
  107.     
  108.     def deselectall(self):
  109.         if self.parent:
  110.             self.parent.deselectall()
  111.         else:
  112.             self.deselecttree()
  113.  
  114.     
  115.     def deselecttree(self):
  116.         if self.selected:
  117.             self.deselect()
  118.         
  119.         for child in self.children:
  120.             child.deselecttree()
  121.         
  122.  
  123.     
  124.     def flip(self, event = None):
  125.         if self.state == 'expanded':
  126.             self.collapse()
  127.         else:
  128.             self.expand()
  129.         self.item.OnDoubleClick()
  130.         return 'break'
  131.  
  132.     
  133.     def expand(self, event = None):
  134.         if not self.item._IsExpandable():
  135.             return None
  136.         
  137.         if self.state != 'expanded':
  138.             self.state = 'expanded'
  139.             self.update()
  140.             self.view()
  141.         
  142.  
  143.     
  144.     def collapse(self, event = None):
  145.         if self.state != 'collapsed':
  146.             self.state = 'collapsed'
  147.             self.update()
  148.         
  149.  
  150.     
  151.     def view(self):
  152.         top = self.y - 2
  153.         bottom = self.lastvisiblechild().y + 17
  154.         height = bottom - top
  155.         visible_top = self.canvas.canvasy(0)
  156.         visible_height = self.canvas.winfo_height()
  157.         visible_bottom = self.canvas.canvasy(visible_height)
  158.         if visible_top <= top and bottom <= visible_bottom:
  159.             return None
  160.         
  161.         (x0, y0, x1, y1) = self.canvas._getints(self.canvas['scrollregion'])
  162.         if top >= visible_top and height <= visible_height:
  163.             fraction = top + height - visible_height
  164.         else:
  165.             fraction = top
  166.         fraction = float(fraction) / y1
  167.         self.canvas.yview_moveto(fraction)
  168.  
  169.     
  170.     def lastvisiblechild(self):
  171.         if self.children and self.state == 'expanded':
  172.             return self.children[-1].lastvisiblechild()
  173.         else:
  174.             return self
  175.  
  176.     
  177.     def update(self):
  178.         if self.parent:
  179.             self.parent.update()
  180.         else:
  181.             oldcursor = self.canvas['cursor']
  182.             self.canvas['cursor'] = 'watch'
  183.             self.canvas.update()
  184.             self.canvas.delete(ALL)
  185.             self.draw(7, 2)
  186.             (x0, y0, x1, y1) = self.canvas.bbox(ALL)
  187.             self.canvas.configure(scrollregion = (0, 0, x1, y1))
  188.             self.canvas['cursor'] = oldcursor
  189.  
  190.     
  191.     def draw(self, x, y):
  192.         self.x = x
  193.         self.y = y
  194.         self.drawicon()
  195.         self.drawtext()
  196.         if self.state != 'expanded':
  197.             return y + 17
  198.         
  199.         if not self.children:
  200.             sublist = self.item._GetSubList()
  201.             if not sublist:
  202.                 return y + 17
  203.             
  204.             for item in sublist:
  205.                 child = self.__class__(self.canvas, self, item)
  206.                 self.children.append(child)
  207.             
  208.         
  209.         cx = x + 20
  210.         cy = y + 17
  211.         cylast = 0
  212.         for child in self.children:
  213.             cylast = cy
  214.             self.canvas.create_line(x + 9, cy + 7, cx, cy + 7, fill = 'gray50')
  215.             cy = child.draw(cx, cy)
  216.             if child.item._IsExpandable():
  217.                 if child.state == 'expanded':
  218.                     iconname = 'minusnode'
  219.                     callback = child.collapse
  220.                 else:
  221.                     iconname = 'plusnode'
  222.                     callback = child.expand
  223.                 image = self.geticonimage(iconname)
  224.                 id = self.canvas.create_image(x + 9, cylast + 7, image = image)
  225.                 self.canvas.tag_bind(id, '<1>', callback)
  226.                 self.canvas.tag_bind(id, '<Double-1>', (lambda x: pass))
  227.                 continue
  228.         
  229.         id = self.canvas.create_line(x + 9, y + 10, x + 9, cylast + 7, fill = 'gray50')
  230.         self.canvas.tag_lower(id)
  231.         return cy
  232.  
  233.     
  234.     def drawicon(self):
  235.         if self.selected:
  236.             if not self.item.GetSelectedIconName() and self.item.GetIconName():
  237.                 pass
  238.             imagename = 'openfolder'
  239.         elif not self.item.GetIconName():
  240.             pass
  241.         imagename = 'folder'
  242.         image = self.geticonimage(imagename)
  243.         id = self.canvas.create_image(self.x, self.y, anchor = 'nw', image = image)
  244.         self.image_id = id
  245.         self.canvas.tag_bind(id, '<1>', self.select)
  246.         self.canvas.tag_bind(id, '<Double-1>', self.flip)
  247.  
  248.     
  249.     def drawtext(self):
  250.         textx = self.x + 20 - 1
  251.         texty = self.y - 1
  252.         labeltext = self.item.GetLabelText()
  253.         if labeltext:
  254.             id = self.canvas.create_text(textx, texty, anchor = 'nw', text = labeltext)
  255.             self.canvas.tag_bind(id, '<1>', self.select)
  256.             self.canvas.tag_bind(id, '<Double-1>', self.flip)
  257.             (x0, y0, x1, y1) = self.canvas.bbox(id)
  258.             textx = max(x1, 200) + 10
  259.         
  260.         if not self.item.GetText():
  261.             pass
  262.         text = '<no text>'
  263.         
  264.         try:
  265.             self.entry
  266.         except AttributeError:
  267.             pass
  268.  
  269.         self.edit_finish()
  270.         
  271.         try:
  272.             label = self.label
  273.         except AttributeError:
  274.             self.label = Label(self.canvas, text = text, bd = 0, padx = 2, pady = 2)
  275.  
  276.         theme = idleConf.GetOption('main', 'Theme', 'name')
  277.         if self.selected:
  278.             self.label.configure(idleConf.GetHighlight(theme, 'hilite'))
  279.         else:
  280.             self.label.configure(idleConf.GetHighlight(theme, 'normal'))
  281.         id = self.canvas.create_window(textx, texty, anchor = 'nw', window = self.label)
  282.         self.label.bind('<1>', self.select_or_edit)
  283.         self.label.bind('<Double-1>', self.flip)
  284.         self.text_id = id
  285.  
  286.     
  287.     def select_or_edit(self, event = None):
  288.         if self.selected and self.item.IsEditable():
  289.             self.edit(event)
  290.         else:
  291.             self.select(event)
  292.  
  293.     
  294.     def edit(self, event = None):
  295.         self.entry = Entry(self.label, bd = 0, highlightthickness = 1, width = 0)
  296.         self.entry.insert(0, self.label['text'])
  297.         self.entry.selection_range(0, END)
  298.         self.entry.pack(ipadx = 5)
  299.         self.entry.focus_set()
  300.         self.entry.bind('<Return>', self.edit_finish)
  301.         self.entry.bind('<Escape>', self.edit_cancel)
  302.  
  303.     
  304.     def edit_finish(self, event = None):
  305.         
  306.         try:
  307.             entry = self.entry
  308.             del self.entry
  309.         except AttributeError:
  310.             return None
  311.  
  312.         text = entry.get()
  313.         entry.destroy()
  314.         if text and text != self.item.GetText():
  315.             self.item.SetText(text)
  316.         
  317.         text = self.item.GetText()
  318.         self.label['text'] = text
  319.         self.drawtext()
  320.         self.canvas.focus_set()
  321.  
  322.     
  323.     def edit_cancel(self, event = None):
  324.         
  325.         try:
  326.             entry = self.entry
  327.             del self.entry
  328.         except AttributeError:
  329.             return None
  330.  
  331.         entry.destroy()
  332.         self.drawtext()
  333.         self.canvas.focus_set()
  334.  
  335.  
  336.  
  337. class TreeItem:
  338.     '''Abstract class representing tree items.
  339.  
  340.     Methods should typically be overridden, otherwise a default action
  341.     is used.
  342.  
  343.     '''
  344.     
  345.     def __init__(self):
  346.         '''Constructor.  Do whatever you need to do.'''
  347.         pass
  348.  
  349.     
  350.     def GetText(self):
  351.         '''Return text string to display.'''
  352.         pass
  353.  
  354.     
  355.     def GetLabelText(self):
  356.         '''Return label text string to display in front of text (if any).'''
  357.         pass
  358.  
  359.     expandable = None
  360.     
  361.     def _IsExpandable(self):
  362.         '''Do not override!  Called by TreeNode.'''
  363.         if self.expandable is None:
  364.             self.expandable = self.IsExpandable()
  365.         
  366.         return self.expandable
  367.  
  368.     
  369.     def IsExpandable(self):
  370.         '''Return whether there are subitems.'''
  371.         return 1
  372.  
  373.     
  374.     def _GetSubList(self):
  375.         '''Do not override!  Called by TreeNode.'''
  376.         if not self.IsExpandable():
  377.             return []
  378.         
  379.         sublist = self.GetSubList()
  380.         if not sublist:
  381.             self.expandable = 0
  382.         
  383.         return sublist
  384.  
  385.     
  386.     def IsEditable(self):
  387.         """Return whether the item's text may be edited."""
  388.         pass
  389.  
  390.     
  391.     def SetText(self, text):
  392.         """Change the item's text (if it is editable)."""
  393.         pass
  394.  
  395.     
  396.     def GetIconName(self):
  397.         '''Return name of icon to be displayed normally.'''
  398.         pass
  399.  
  400.     
  401.     def GetSelectedIconName(self):
  402.         '''Return name of icon to be displayed when selected.'''
  403.         pass
  404.  
  405.     
  406.     def GetSubList(self):
  407.         '''Return list of items forming sublist.'''
  408.         pass
  409.  
  410.     
  411.     def OnDoubleClick(self):
  412.         '''Called on a double-click on the item.'''
  413.         pass
  414.  
  415.  
  416.  
  417. class FileTreeItem(TreeItem):
  418.     '''Example TreeItem subclass -- browse the file system.'''
  419.     
  420.     def __init__(self, path):
  421.         self.path = path
  422.  
  423.     
  424.     def GetText(self):
  425.         if not os.path.basename(self.path):
  426.             pass
  427.         return self.path
  428.  
  429.     
  430.     def IsEditable(self):
  431.         return os.path.basename(self.path) != ''
  432.  
  433.     
  434.     def SetText(self, text):
  435.         newpath = os.path.dirname(self.path)
  436.         newpath = os.path.join(newpath, text)
  437.         if os.path.dirname(newpath) != os.path.dirname(self.path):
  438.             return None
  439.         
  440.         
  441.         try:
  442.             os.rename(self.path, newpath)
  443.             self.path = newpath
  444.         except os.error:
  445.             pass
  446.  
  447.  
  448.     
  449.     def GetIconName(self):
  450.         if not self.IsExpandable():
  451.             return 'python'
  452.         
  453.  
  454.     
  455.     def IsExpandable(self):
  456.         return os.path.isdir(self.path)
  457.  
  458.     
  459.     def GetSubList(self):
  460.         
  461.         try:
  462.             names = os.listdir(self.path)
  463.         except os.error:
  464.             return []
  465.  
  466.         names.sort((lambda a, b: cmp(os.path.normcase(a), os.path.normcase(b))))
  467.         sublist = []
  468.         for name in names:
  469.             item = FileTreeItem(os.path.join(self.path, name))
  470.             sublist.append(item)
  471.         
  472.         return sublist
  473.  
  474.  
  475.  
  476. class ScrolledCanvas:
  477.     
  478.     def __init__(self, master, **opts):
  479.         if not opts.has_key('yscrollincrement'):
  480.             opts['yscrollincrement'] = 17
  481.         
  482.         self.master = master
  483.         self.frame = Frame(master)
  484.         self.frame.rowconfigure(0, weight = 1)
  485.         self.frame.columnconfigure(0, weight = 1)
  486.         self.canvas = Canvas(self.frame, **opts)
  487.         self.canvas.grid(row = 0, column = 0, sticky = 'nsew')
  488.         self.vbar = Scrollbar(self.frame, name = 'vbar')
  489.         self.vbar.grid(row = 0, column = 1, sticky = 'nse')
  490.         self.hbar = Scrollbar(self.frame, name = 'hbar', orient = 'horizontal')
  491.         self.hbar.grid(row = 1, column = 0, sticky = 'ews')
  492.         self.canvas['yscrollcommand'] = self.vbar.set
  493.         self.vbar['command'] = self.canvas.yview
  494.         self.canvas['xscrollcommand'] = self.hbar.set
  495.         self.hbar['command'] = self.canvas.xview
  496.         self.canvas.bind('<Key-Prior>', self.page_up)
  497.         self.canvas.bind('<Key-Next>', self.page_down)
  498.         self.canvas.bind('<Key-Up>', self.unit_up)
  499.         self.canvas.bind('<Key-Down>', self.unit_down)
  500.         self.canvas.bind('<Alt-Key-2>', self.zoom_height)
  501.         self.canvas.focus_set()
  502.  
  503.     
  504.     def page_up(self, event):
  505.         self.canvas.yview_scroll(-1, 'page')
  506.         return 'break'
  507.  
  508.     
  509.     def page_down(self, event):
  510.         self.canvas.yview_scroll(1, 'page')
  511.         return 'break'
  512.  
  513.     
  514.     def unit_up(self, event):
  515.         self.canvas.yview_scroll(-1, 'unit')
  516.         return 'break'
  517.  
  518.     
  519.     def unit_down(self, event):
  520.         self.canvas.yview_scroll(1, 'unit')
  521.         return 'break'
  522.  
  523.     
  524.     def zoom_height(self, event):
  525.         ZoomHeight.zoom_height(self.master)
  526.         return 'break'
  527.  
  528.  
  529.  
  530. def test():
  531.     import PyShell
  532.     root = Toplevel(PyShell.root)
  533.     root.configure(bd = 0, bg = 'yellow')
  534.     root.focus_set()
  535.     sc = ScrolledCanvas(root, bg = 'white', highlightthickness = 0, takefocus = 1)
  536.     sc.frame.pack(expand = 1, fill = 'both')
  537.     item = FileTreeItem('C:/windows/desktop')
  538.     node = TreeNode(sc.canvas, None, item)
  539.     node.expand()
  540.  
  541.  
  542. def test2():
  543.     root = Tk()
  544.     root.configure(bd = 0)
  545.     canvas = Canvas(root, bg = 'white', highlightthickness = 0)
  546.     canvas.pack(expand = 1, fill = 'both')
  547.     item = FileTreeItem(os.curdir)
  548.     node = TreeNode(canvas, None, item)
  549.     node.update()
  550.     canvas.focus_set()
  551.  
  552. if __name__ == '__main__':
  553.     test()
  554.  
  555.